package com.huluobo.a2205kotlinjetpackdemo.flow

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.huluobo.a2205kotlinjetpackdemo.R
import com.huluobo.a2205kotlinjetpackdemo.hilt.UserBean
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch

/**
 * flow:
 * kotlin中的数据流,可以发送多条数据,可以按照顺序发送多个值
 * 1.emit 是发送的意思,必须要要有个collect接受
 * 2.flow是一个挂起方法,必须运行在协程中
 * 3.flow是数据流,但是是一个冷流
 * 冷流:在数据被订阅之后,发布者才能执行发送数据的代码,类似懒加载
 */
class FlowActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_flow)

        CoroutineScope(Job()).launch {
            loadData().collect {
                Log.i("TagA", "int::$it")
            }
        }


    }

    val oneToTen = 1..20
    private fun loadData() = flow {
        Log.i("TagA", "进入loadData方法")
        for (i in oneToTen) {
            emit(i)//发送数据
            kotlinx.coroutines.delay(1000)
        }
    }.filter {
//        it % 2 == 0 //添加判断,用于过滤发送的内容
        it > 10
    }.map {
        //转化,类似工厂模式,可以将flow流的内容转化为其他形式输出
        UserBean("lC", "123", it)
    }
}